From a12beb61d9052586b0df848fe3d62edcfd2300b2 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Wed, 23 Jul 2014 17:57:49 -0700 Subject: [PATCH] Supply the crate version via ENV vars --- src/cargo/ops/cargo_rustc/mod.rs | 32 +++++++++++++++++++++++----- tests/test_cargo_compile.rs | 36 ++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 02bec0deb..c4b319973 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -1,5 +1,6 @@ use std::io::{fs, UserRWX}; use std::collections::HashSet; +use semver::Version; use core::{Package, PackageId, PackageSet, Target, Resolve}; use util; @@ -144,8 +145,7 @@ fn compile_custom(pkg: &Package, cmd: &str, // be building a C lib for a plugin let layout = cx.layout(false); let output = layout.native(pkg); - let mut p = util::process(cmd.next().unwrap()) - .cwd(pkg.get_root()) + let mut p = process(cmd.next().unwrap(), pkg) .env("OUT_DIR", Some(&output)) .env("DEPS_DIR", Some(&output)) .env("TARGET", cx.config.target()); @@ -204,9 +204,7 @@ fn rustc(package: &Package, target: &Target, fn prepare_rustc(package: &Package, target: &Target, crate_types: Vec<&str>, cx: &Context, req: PlatformRequirement) -> Vec { - let root = package.get_root(); - - let base = util::process("rustc").cwd(root.clone()); + let base = process("rustc", package); let base = build_base_args(base, target, crate_types.as_slice()); let target_cmd = build_plugin_args(base.clone(), cx, false); @@ -356,3 +354,27 @@ fn build_deps_args(mut cmd: ProcessBuilder, target: &Target, package: &Package, } } } + +pub fn process(cmd: T, pkg: &Package) -> ProcessBuilder { + util::process(cmd) + .cwd(pkg.get_root()) + .env("CARGO_PKG_VERSION_MAJOR", Some(pkg.get_version().major.to_string())) + .env("CARGO_PKG_VERSION_MINOR", Some(pkg.get_version().minor.to_string())) + .env("CARGO_PKG_VERSION_PATCH", Some(pkg.get_version().patch.to_string())) + .env("CARGO_PKG_VERSION_PRE", pre_version_component(pkg.get_version())) +} + +fn pre_version_component(v: &Version) -> Option { + if v.pre.is_empty() { + return None; + } + + let mut ret = String::new(); + + for (i, x) in v.pre.iter().enumerate() { + if i != 0 { ret.push_char('.') }; + ret.push_str(x.to_string().as_slice()); + } + + Some(ret) +} diff --git a/tests/test_cargo_compile.rs b/tests/test_cargo_compile.rs index 9c1c6d548..cd29b9903 100644 --- a/tests/test_cargo_compile.rs +++ b/tests/test_cargo_compile.rs @@ -740,6 +740,42 @@ test!(custom_build_env_vars { assert_that(p.cargo_process("cargo-build"), execs().with_status(0)); }) +test!(crate_version_env_vars { + let p = project("foo") + .file("Cargo.toml", r#" + [project] + + name = "foo" + version = "0.5.1-alpha.1" + authors = ["wycats@example.com"] + + [[bin]] + name = "foo" + "#) + .file("src/foo.rs", r#" + use std::os; + + static VERSION_MAJOR: &'static str = env!("CARGO_PKG_VERSION_MAJOR"); + static VERSION_MINOR: &'static str = env!("CARGO_PKG_VERSION_MINOR"); + static VERSION_PATCH: &'static str = env!("CARGO_PKG_VERSION_PATCH"); + static VERSION_PRE: &'static str = env!("CARGO_PKG_VERSION_PRE"); + + fn main() { + println!("{}-{}-{} @ {}", + VERSION_MAJOR, + VERSION_MINOR, + VERSION_PATCH, + VERSION_PRE); + } + "#); + + assert_that(p.cargo_process("cargo-build"), execs().with_status(0)); + + assert_that( + process(p.bin("foo")), + execs().with_stdout("0-5-1 @ alpha.1\n")); +}) + test!(custom_build_in_dependency { let mut p = project("foo"); let bar = p.root().join("bar"); -- 2.30.2